package cn.cdeden.sys.service.impl;


import cn.cdeden.common.core.utils.MapstructUtils;
import cn.cdeden.common.mybatis.core.page.PageQuery;
import cn.cdeden.common.core.utils.page.TableDataInfo;
import cn.cdeden.common.mybatis.validator.QueryHelpMybatisPlus;
import cn.cdeden.common.redis.utils.RedisUtils;
import cn.cdeden.sys.domain.SysParametersConfig;
import cn.cdeden.sys.domain.dto.SysGeneralConfigQueryParam;
import cn.cdeden.sys.domain.dto.SysParametersConfigDto;
import cn.cdeden.sys.domain.dto.SysParametersConfigQueryParam;
import cn.cdeden.sys.enums.SysParametersConfigEnums;
import cn.cdeden.sys.mapper.SysParametersConfigMapper;
import cn.cdeden.sys.service.SysParametersQueryConfigService;
import cn.cdeden.sys.utils.SysConfigDefaultParameters;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.coyote.BadRequestException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @ProjectName : ecm_svn
 * @Package : com.cdyd.ecm.sys.service.impl
 * @ClassName : SysParametersQueryConfigServiceImpl
 * @Author : Yu.
 * @Description : // TODO
 * @Date : 2024/4/21 16:55
 * @Version : 1.0
 */
@Slf4j
@Service
@AllArgsConstructor
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class SysParametersQueryConfigServiceImpl extends ServiceImpl<SysParametersConfigMapper, SysParametersConfig> implements SysParametersQueryConfigService {

    private static final String KEY_ = "sys:parameters:config";

    private final RedisUtils redisUtils;

    private final SysParametersConfigMapper sysParametersConfigMapper;

//    private final DictDetailService dictDetailService;


    @Override
    public TableDataInfo<SysParametersConfigDto> queryAll(SysParametersConfigQueryParam query, PageQuery pageable) {
//        IPage<SysParametersConfig> queryPage = PageUtil.toMybatisPage(pageable);
        QueryWrapper<SysParametersConfig> wrapper = QueryHelpMybatisPlus.getPredicate(query);
        wrapper.orderByAsc("orderindex");
        IPage<SysParametersConfig> page = sysParametersConfigMapper.selectPage(pageable.build(), wrapper);
//        return ConvertUtil.convertPage(page, SysParametersConfigDto.class, pageable);
//        return MapstructUtils.convert(page, SysParametersConfigDto.class);
        return null;
    }

    @Override
    public List<SysParametersConfigDto> queryAll(SysGeneralConfigQueryParam query) {
//        return ConvertUtil.convertList(sysParametersConfigMapper.selectList(QueryHelpMybatisPlus.getPredicate(query)), SysParametersConfigDto.class);
        return MapstructUtils.convert(sysParametersConfigMapper.selectList(QueryHelpMybatisPlus.getPredicate(query)), SysParametersConfigDto.class);
    }

    @Override
    public SysParametersConfigDto getByCode(String code, String type) throws BadRequestException {
        return getByCode(code, type, false);
    }

    @Override
    public SysParametersConfigDto getByCode(String code, String type, boolean mandatory) throws BadRequestException {

        if (StringUtils.isBlank(type) && judgmentTypeData(type)) {
            throw new RuntimeException("参数异常");
        }
        String s = KEY_ + ":" + type + ":" + code;
        SysParametersConfigDto convert = null;
        Object o = null;
        if (!mandatory) {
//            o = redisUtils.get(s);
        }

        if (ObjectUtils.isEmpty(o)) {
            LambdaQueryWrapper<SysParametersConfig> wrapper = new LambdaQueryWrapper<SysParametersConfig>()
                    .eq(SysParametersConfig::getConfigCode, code)
                    .eq(SysParametersConfig::getConfigType, type);
            SysParametersConfig one = this.getOne(wrapper);
            if (ObjectUtils.isNotEmpty(one)) {
//                convert = ConvertUtil.convert(one, SysParametersConfigDto.class);
                convert = MapstructUtils.convert(one, SysParametersConfigDto.class);
            } else {
                SysParametersConfig defaultEnums = SysConfigDefaultParameters.find(code, type);
                if (defaultEnums == null) {
                    throw new BadRequestException("该类型无法恢复默认配置,code:"+code+",type:"+type+"");
                }
//                convert = ConvertUtil.convert(defaultEnums, SysParametersConfigDto.class);
                convert = MapstructUtils.convert(defaultEnums, SysParametersConfigDto.class);
                //添加有默认值的api
                try {
//                    this.save(ConvertUtil.convert(convert, SysParametersConfig.class));
                    this.save(MapstructUtils.convert(convert, SysParametersConfig.class));
                } catch (Exception e) {
                }
                convert.setCreateId(null);
                convert.setCreateBy(null);
                convert.setCreateTime(null);
                convert.setUpdateId(null);
                convert.setUpdateId(null);
                convert.setUpdateBy(null);
                convert.setUpdateTime(null);
            }
//            boolean set = redisUtils.set(s, JSONObject.toJSONString(convert), 8L, TimeUnit.HOURS);
        } else {
            convert = JSONObject.parseObject(o.toString(), SysParametersConfigDto.class);
        }
        return convert;
    }

    @Override
    public List<SysParametersConfigDto> getByCodes(String code, SysParametersConfigEnums enums) throws BadRequestException {
        if (ObjectUtils.isEmpty(enums)) {
            throw new RuntimeException("类型不可为空");
        }
        List<String> split = Arrays.asList(code.split(","));
        List<SysParametersConfigDto> list = new ArrayList<>();
        for (String s : split) {
            SysParametersConfigDto configDto = getByCode(s, enums.getCode());
//            SysParametersConfig config = ConvertUtil.convert(configDto, SysParametersConfig.class);
            list.add(configDto);
        }

        list.forEach(config -> {
            String storageUrl = config.getStorageUrl();
            if (StringUtils.equalsIgnoreCase(config.getType(), "file") && StringUtils.isNotBlank(storageUrl)) {
//                config.setStorageUrl(ImageFileUrlUtil.imageFile(storageUrl));
            }
        });
//        return ConvertUtil.convertList(list,SysParametersConfigDto.class);
        return list;
    }






    @Override
    public SysParametersConfig getById(String id) {
        return sysParametersConfigMapper.selectById(id);
    }

    @Override
//    @Cacheable(key = "'sys:parameters:config:id:' + #p0")
    public SysParametersConfigDto findById(String id) {
//        return ConvertUtil.convert(getById(id), SysParametersConfigDto.class);
        return MapstructUtils.convert(getById(id), SysParametersConfigDto.class);
    }

    @Override
    public boolean judgmentTypeData(String type) {
        return false;
    }


    public static final String CONFIG = "sys_parameters_config";

//    @Override
//    public boolean judgmentTypeData(String type) {
//        List<DictDetailDto> dictByName = dictDetailService.getDictByName(CONFIG);
//        for (DictDetailDto dictDetailDto : dictByName) {
//            if (StringUtils.equals(type, dictDetailDto.getValue())) {
//                return true;
//            }
//        }
//        return false;
//    }

    @Override
    public boolean deleteRedisInfo(String code, String type) {
        String keys = KEY_ + ":" + type + ":" + code;
//        redisUtils.del(keys);
        return false;
    }


}
